#include "../import/head.h"
#include "get_odbc.h"
#include "../data_struct/head.h"
#include "../global/head.h"
#include "../macro/head.h"
#include "../msg/head.h"
#include "../helper_odbc/head.h"
#include "os_init.h"

///////////////////////////////////////////////////////////////////////////////////////////////
// 

namespace xos_sgsj
{
    get_odbc::get_odbc()
    {
		m_pCallbackWorkerThread = 0;
		m_pOdbcMgr = 0;
		m_pConnect = 0;
    }

    get_odbc::~get_odbc()
    {
        term();
    }

    /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    // 

	int get_odbc::notify( xos::i_msg * pMsg )
	{
		int ret = 0;

		xos::i_msg * pmsg = 0;

		if( 0 == ret )
		{
			ret = g_pSysData->m_os.m_pXos->create( xos::i_xos::XOS_OBJ_MSG, (void **)&pmsg );
		}

		if( 0 == ret )
		{
			pmsg->set_runnable( 0, this );
			pmsg->set_void( 0, pMsg );
		}

		if( 0 == ret )
		{
			m_pCallbackWorkerThread->notify( pmsg );
			pmsg = 0;
		}

		if( pmsg )
		{
			pmsg->release();
			pmsg = 0;
		}

		return ret;
	}

	int get_odbc::run_task( xos::i_msg * pMsg )
	{
		int ret = 0;

		xos::i_msg * pmsg = ( xos::i_msg * )pMsg->get_void( 0, 0 );

		helper_odbc obj;
		ret = obj.run_task( pmsg );
		pmsg = 0;

		if( pMsg )
		{
			pMsg->release();
			pMsg = 0;
		}

		return ret;
	}

	/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
	// 

    int get_odbc::init()
    {
        int ret = 0;

		if( 0 == ret )
		{
			ret = g_pSysData->m_os.m_pXos->create( xos::i_xos::XOS_OBJ_CALLBACK, (void **)&m_pCallbackWorkerThread );
		}

        if( 0 == ret )
        {
            xos_odbc::create( g_pSysData->m_os.m_pXos, &m_pOdbcMgr );
            if( !m_pOdbcMgr )
            {
                ret = 1;
            }
        }

		if( 0 == ret )
		{
			ret = m_pOdbcMgr->init();
		}

        if( 0 == ret )
        {
            g_pSysData->m_os.m_pOdbcMgr = m_pOdbcMgr;
        }

		return ret;
    }

    int get_odbc::term()
    {
        int ret = 0;

		if( m_pCallbackWorkerThread )
		{
			m_pCallbackWorkerThread->release();
			m_pCallbackWorkerThread = 0;
		}

        g_pSysData->m_os.m_pOdbcMgr = 0;
		g_pSysData->m_os.m_pConnect = 0;

		if( m_pConnect )
		{
			m_pConnect->release();
			m_pConnect = 0;
		}

        if( m_pOdbcMgr )
        {
			m_pOdbcMgr->term();
			m_pOdbcMgr->release();
			m_pOdbcMgr = 0;
        }

        return ret;
    }

} // xos_sgsj
